package faketime

import (
	"context"
	"fmt"
	"github.com/jonboulle/clockwork"
	"os"
	"strings"
	"time"
)

// 定义一个全局的 FakeClock 实例
var fakeClock clockwork.FakeClock
var (
	ctx    context.Context
	cancel context.CancelFunc
)

func init() {
	// 创建 FakeClock 实例
	fakeClock = clockwork.NewFakeClock()
	// 监控时间戳文件的路径
	ctx, cancel = context.WithCancel(context.Background())
	// 定期检查文件时间戳并更新 FakeClock
	go updateFakeClock(ctx)
}

// 退出
func exitFakeClock() {
	// 执行一些操作
	// ...
	// 准备退出时,调用 cancel() 函数
	cancel()
}
func updateFakeClock(ctx context.Context) {
	timestampFile := "Server.time"
	ticker := time.NewTicker(10 * time.Second)
	defer ticker.Stop()
	for {
		select {
		case <-ticker.C:
			content, err := os.ReadFile(timestampFile)
			if err != nil {
				fmt.Printf("Error reading file %s: %v\n", timestampFile, err)
				return
			}

			// 解析文件中的时间戳
			newTime, err := parseCustomTimeString(string(content))
			if err != nil {
				fmt.Printf("Error parsing time string: %v\n", err)
				return
			}

			// 将 FakeClock 时间设置为解析后的时间
			fmt.Printf("Updating FakeClock time to: %s\n", newTime)
			fakeClock.Advance(newTime.Sub(fakeClock.Now()))
		case <-ctx.Done():
			// context 被取消时退出协程
			return
		}
	}
}

// parseTimeString 函数解析类似 "+91820 x1" 的时间字符串
func parseCustomTimeString(timeStr string) (time.Time, error) {
	parts := strings.Split(timeStr, " ")
	if len(parts) != 2 {
		return time.Time{}, fmt.Errorf("invalid time string format: %s", timeStr)
	}

	var duration time.Duration
	var err error
	if parts[0][0] == '+' {
		duration, err = time.ParseDuration(parts[0][1:] + "s")
		if err != nil {
			return time.Time{}, fmt.Errorf("error parsing time duration: %v", err)
		}
		return time.Now().Add(duration), nil
	} else if parts[0][0] == '-' {
		duration, err = time.ParseDuration(parts[0][1:] + "s")
		if err != nil {
			return time.Time{}, fmt.Errorf("error parsing time duration: %v", err)
		}
		return time.Now().Add(-duration), nil
	} else {
		return time.Time{}, fmt.Errorf("invalid time string format: %s", timeStr)
	}
}

// Now 替换 time.Now() 函数
func Now() time.Time {
	return fakeClock.Now()
}
